package com.example.kotlin.mvp.base

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.kotlin.mvp.proxy.ActivityMvpProxy
import com.example.kotlin.mvp.proxy.ActivityMvpProxyImpl

/**
 * @ClassName: BaseMvpActivity
 * @Description: java类作用描述
 * @Author: chenmengjia
 * @Date: 2022/2/7 9:06
 */
abstract class BaseMvpActivity<P : BasePresenter<*, *>> : AppCompatActivity(), BaseView {
    private var mPresenter: P? = null
    private var activityMvpProxy: ActivityMvpProxy? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView()
        // 创建 P，创建只能交给 子类，每个 Activity 都不一样
        mPresenter = createPresenter()
       // mPresenter!!.attach(this)
        activityMvpProxy = createMvpProxy()
        // 1. Activity ？ Fragment? 1,2  ViewGroup ? 抽离  工具类抽出去，或者把代码每个地方 copy 一份
        // 今天你可以抽离目前的一部分：注入代码 + 额外功能 + 还有一些其他地方又不一样

//        // 这个地方要去注入 Presenter 通过反射 (Dagger) soEasy
//        Field[] fields = this.getClass().getDeclaredFields();
        // 1. Activity ？ Fragment? 1,2  ViewGroup ? 抽离  工具类抽出去，或者把代码每个地方 copy 一份
        // 今天你可以抽离目前的一部分：注入代码 + 额外功能 + 还有一些其他地方又不一样

//        // 这个地方要去注入 Presenter 通过反射 (Dagger) soEasy
//        Field[] fields = this.getClass().getDeclaredFields();
        activityMvpProxy?.bindAndCreatePresenter()
        initView()
        initData()
    }

    abstract fun initData()

    abstract fun initView()

    abstract fun createPresenter(): P?

    abstract fun setContentView()

    override fun onDestroy() {
        super.onDestroy()
        // 一定要解绑
        activityMvpProxy?.unbindPresenter()
        mPresenter?.detach()
    }
    fun getPresenter()=mPresenter
    protected open fun createMvpProxy(): ActivityMvpProxy? {
        if (activityMvpProxy == null) {
            activityMvpProxy = ActivityMvpProxyImpl(this)
        }
        return activityMvpProxy
    }

}